Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - [Delphi 7] E' possibile salvare in Jpeg nello Stream, un immagine di un image1?
Forum - Delphi - [Delphi 7] E' possibile salvare in Jpeg nello Stream, un immagine di un image1?

Avatar
Track (Normal User)
Rookie


Messaggi: 30
Iscritto: 23/01/2011

Segnala al moderatore
Postato alle 1:46
Domenica, 07/08/2011
Salve a tutti, come da titolo, mi piacerebbe sapere se è possibile salvare in Jpeg nello stream un immagine presente su un image1 :)

PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 11:23
Domenica, 07/08/2011
Vediamo se ho capito ...
Per utilizzare lo stream devi andare a beccare la classe graphics, sotto un piccolo esempio

Codice sorgente - presumibilmente Delphi

  1. Var oStm:TMemoryStream;
  2. begin
  3.   oStm:= TMemoryStream.Create;
  4.   Try
  5.     Image1.Picture.Graphic.SaveToStream(oStm);
  6.     // Uso stream per salvare l'immagine
  7.     oStm.SaveToFile('c:\file\test.jpg');
  8.   Finally
  9.     oStm.Free;
  10.   End;



G.

Perfetto, posso sempre provare, comunque non mi interessa salvare in C:, ma solo come salvare un image1 nello stream, grazie di tutto, ti faccio sapere :) - Track - 07/08/11 20:24
il savetostream è solo per completare l'esempio e per testare che dentro lo stream ci sia l'immagine - Goblin - 07/08/11 20:28
Scusa l'ignoranza, ma Ostm.Free, cosa vorrebbe dire precisamente? - Track - 11/08/11 22:30
oStm.free serve per fare il free (distruggere) l'oggetto stream una volta usato, e liberare risorse - Goblin - 11/08/11 22:47
Ma una volta salvato, rimane salvato nello stream? cioè, posso fare un LoadFromStream ? - Track - 12/08/11 00:32
Perdona l'ignoranza... - Track - 12/08/11 13:59


Ibis redibis non morieris in bello
PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
2
Down
V
Segnala al moderatore
Postato alle 21:29
Domenica, 14/08/2011
allora .. in base alla richiesta di Track posto 2 righe di come farei io in un applicazione con solo 1 form, in quanto ho deciso di utilizzare una variabile public della form.
la form è semplice 2 componenti TImage (image1 sorgente e image2 destinazione), 2 Tbutton (button1 carica nello stream button2 scarica dallo stream al componente image).
Ho deciso di discernere i tipi di immagine dunque nelle uses bisogna aggiungere jpeg,pngimage in modo da gestire oltre le bmp anche png e jpeg(jpg)

dichiaro la variabile.
Codice sorgente - presumibilmente Delphi

  1. public
  2.     foStreamImage: TMemoryStream;



creazione e distruzione oggetto stream
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   foStreamImage := TMemoryStream.Create;
  4. end;
  5.  
  6. procedure TForm1.FormDestroy(Sender: TObject);
  7. begin
  8.   if Assigned(foStreamImage) then
  9.     FreeAndNil(foStreamImage);
  10. end;



Button1click carico nello stream l'immagine
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   Image1.Picture.Graphic.SaveToStream(foStreamImage);
  4. end;



button2click scrivo lo stream in image scegliendo il tipo di immagine
Codice sorgente - presumibilmente Delphi

  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var
  3.   FirstBytes: AnsiString;
  4.   Graphic: TGraphic;
  5. begin
  6.   Graphic := nil;
  7.   Screen.Cursor := crHourGlass;
  8.   Image2.Picture := Nil;
  9.   foStreamImage.Seek(0, soFromBeginning );  // reset stream
  10.   try
  11.     SetLength(FirstBytes, 8);
  12.     foStreamImage.Read(FirstBytes[1], 8);
  13.     if Copy(FirstBytes, 1, 2) = 'BM' then
  14.       Graphic := TBitmap.Create
  15.     else if FirstBytes = #137'PNG'#13#10#26#10 then
  16.       Graphic := TPngImage.Create
  17.     else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
  18.       Graphic := TJPEGImage.Create;
  19.     if Assigned(Graphic) then
  20.     begin
  21.       try
  22.         foStreamImage.Seek(0, soFromBeginning );
  23.         Graphic.LoadFromStream(foStreamImage);
  24.         Image2.Picture.Assign(Graphic);
  25.       except
  26.        // gestione eccezione
  27.       end;
  28.     end
  29.     else
  30.       ShowMessage('Formato immagine non riconosciuto');
  31.   finally
  32.     Screen.Cursor := crDefault;
  33.     Graphic.Free;
  34.   end;
  35.   Image2.Refresh;
  36. end;



..... il tutto ovviamente è migliorabile per mezzo di una property con funzioni get/set in modo da evitare il button1 ... lo lascio come compito per le vacanze a chi lo vuole svolgere :)
un saluto e spero di non aver detto troppe cavolate
G.

Ultima modifica effettuata da Goblin il 14/08/2011 alle 21:35
Ti ringrazio davvero, con tutto il cuore! :) - Track - 14/08/11 22:00


Ibis redibis non morieris in bello
PM
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 21:01
Venerdì, 12/08/2011
Allora ..
L'oggetto oStm è dichiarato dentro una procedura come variabile locale, e dentro la procedure nasce, vive e muore.
Se vogliamo un oggetto memory stream a livello di applicazione abbiamo molteplici strade da seguire:
1) variabile globale (BRRRR orrore)
2) Variabile public/protected/private della classe mainform (quasi accettabile)
3) Oggetto dentro un Datamodule contenente oggetti che viene creato all'inizio del programma e distrutto alla fine (ottimo compromesso)
4) Variabile locale della procedura (uso e consumo "ad hoc)
Dunque per rispondere alla tua domanda, nel caso 1,2,3 se lo stream viene caricato è sempre presente in tutto il programma e l'immagine (contenuto) è sempre a disposizione, sino a quando non viene fatto un clear o un free, nel caso 4 una volta usciti dalla procedura la variabile stream viene persa.
Spero di essere stato abbastanza chiaro :)
G.

NB: ricordo che ad ogni create corrisponde un free ......

Ultima modifica effettuata da Goblin il 12/08/2011 alle 21:13
Ma quindi l'immagine è sempre caricata sino a quanto non si viene fatto un Clear o un Free?, scusami allora potresti (ovviamente se non disturbo) cercare di "correggere" l'esempio creato, sottolineo prima della tua spiegazione? - Track - 14/08/11 01:48
L'esempio in questione è il seguente : http://www.megaupload.com/?d=FG4Q2FSE - Track - 14/08/11 01:48
Purtroppo non capisco come variare il codice per l'utilizzo che mi serve... - Track - 14/08/11 20:07


Ibis redibis non morieris in bello
PM
Avatar
Nullable (Normal User)
Expert


Messaggi: 217
Iscritto: 12/07/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 15:21
Domenica, 07/08/2011
Se il codice dovesse essere come quello di Goblin ( non conosco il Delphi ) allora quando vai a richiamare SaveToFile sei tu a decidere l'estensione dell'immagine, il programma ti salverà quell'immagine con l'estensione scelta da te quindi sì che è possibile.

Ultima modifica effettuata da Nullable il 07/08/2011 alle 15:22
PM